/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package DAO;

import bean.Autor;
import bean.Capitulo;
import bean.Instituicao;
import bean.LivroOrganizado;
import java.io.Serializable;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author fernando
 */
public class CapituloDao implements Serializable {

    private Conexao conexao;
    private PreparedStatement ps;
    private boolean sucess = false;

    public CapituloDao() {
        conexao = new ConexaoPostgres();

    }

    public boolean cadastrarCapitulo(Capitulo capitulo) {

        sucess = false;


        try {
            ps = conexao.getConnection().prepareStatement("INSERT INTO obra(titulo, pagina_inicio, pagina_fim, tipo, obra_pai) VALUES (?, ?, ?, ?, ?)");
            ps.setString(1, capitulo.getTitulo());
            ps.setInt(2, capitulo.getPaginaInicio());
            ps.setInt(3, capitulo.getPaginaFim());
            ps.setString(4, "Capítulo");
            ps.setInt(5, capitulo.getLivroOrganizado().getId());
            ps.executeUpdate();
            conexao.closeConnection();

            capitulo.setId(this.buscaIdCapitulo(capitulo).getId());

            Autor autor = new Autor();
            Iterator i = capitulo.getAutores().iterator();
            int posicao = 1;
            while (i.hasNext()) {
                ps = conexao.getConnection().prepareStatement("INSERT INTO obra_autor(id_obra, id_autor, posicao) VALUES (?, ?, ?)  ");
                ps.setInt(1, capitulo.getId());
                autor = (Autor) i.next();
                System.out.println("Capitulo DAO - Cadastro de Capitulo - ID Autor: " + autor.getId());
                ps.setInt(2, autor.getId());

                ps.setInt(3, posicao);
                ps.executeUpdate();
                conexao.closeConnection();
                posicao++;
                
            }

        } catch (SQLException ex) {
            Logger.getLogger(CapituloDao.class.getName()).log(Level.SEVERE, null, ex);
        }



        sucess = true;

        return sucess;
    }

    public boolean alterarCapitulo(Capitulo capitulo) {
        sucess = false;



        try {
            System.out.println("Dao - Alterar Capitulo: ");
            System.out.println("ID: " + capitulo.getId());
            System.out.println("Titulo: " + capitulo.getTitulo());


            ps = conexao.getConnection().prepareStatement("UPDATE Obra SET titulo = ? , pagina_inicio = ? , pagina_fim = ?, obra_pai = ? WHERE id = ?");
            ps.setString(1, capitulo.getTitulo());
            ps.setInt(2, capitulo.getPaginaInicio());
            ps.setInt(3, capitulo.getPaginaFim());
            ps.setInt(4, capitulo.getLivroOrganizado().getId());
            ps.setInt(5, capitulo.getId());
            ps.executeUpdate();
            conexao.closeConnection();


            //Remove Todos os elementos para inserir o que se alterar
            ps = conexao.getConnection().prepareStatement(" DELETE FROM obra_autor WHERE id_obra = ?");
            ps.setLong(1, (capitulo.getId()));
            ps.executeUpdate();
            conexao.closeConnection();

            Iterator i;
            i = capitulo.getAutores().iterator();
            int posicao = 1;
            while (i.hasNext()) {
                ps = conexao.getConnection().prepareStatement("INSERT INTO obra_autor(id_obra, id_autor, posicao) VALUES (?, ?, ?)  ");
                ps.setInt(1, capitulo.getId());
                Autor autor = (Autor) i.next();
                ps.setInt(2, autor.getId());
                ps.setInt(3, posicao);
                ps.executeUpdate();
                conexao.closeConnection();
                posicao++;

            }






        } catch (SQLException ex) {
            System.out.println("Erro no Método de edição de Capítulo ");
            conexao.closeConnection();
            Logger.getLogger(InstituicaoDao.class.getName()).log(Level.SEVERE, null, ex);
            return sucess;
        }

        conexao.closeConnection();
        sucess = true;
        return sucess;
    }

    public boolean removerCapitulo(Capitulo capitulo) {
        sucess = false;
        try {


            ps = conexao.getConnection().prepareStatement(" DELETE FROM obra_autor WHERE id_obra = ?");
            ps.setLong(1, (capitulo.getId()));
            ps.executeUpdate();
            conexao.closeConnection();

            ps = conexao.getConnection().prepareStatement(" DELETE FROM obra WHERE id = ?");
            ps.setLong(1, (capitulo.getId()));
            ps.executeUpdate();
            conexao.closeConnection();

            sucess = true;
        } catch (SQLException ex) {
            ex.printStackTrace();
            conexao.closeConnection();
            return sucess;
        }

        conexao.closeConnection();
        return sucess;
    }

    public List<Capitulo> buscarCapitulosLivro(LivroOrganizado livro) {
        ArrayList<Capitulo> capituloLivro = new ArrayList<Capitulo>();
        try {
            ps = conexao.getConnection().prepareStatement("SELECT id, titulo, pagina_inicio, pagina_fim, obra_pai  "
                    + "FROM obra "
                    + "WHERE obra_pai = ? ORDER BY pagina_inicio ; ");
            ps.setInt(1, livro.getId());
            ResultSet rs = ps.executeQuery();
            conexao.closeConnection();
            Capitulo c = new Capitulo();
            LivroOrganizadoDao loDAO = new LivroOrganizadoDao();

            while (rs.next()) {

                c.setId(rs.getInt("id"));
                c.setTitulo(rs.getString("titulo"));
                c.setPaginaInicio(rs.getInt("pagina_inicio"));
                c.setPaginaFim(rs.getInt("pagina_fim"));
                c.setAutores(this.buscarAutoresLivro(c));
                c.setLivroOrganizado(livro);


                capituloLivro.add(c);

                c = new Capitulo();

            }

        } catch (SQLException ex) {
            this.conexao.closeConnection();
            Logger
                    .getLogger(LivroDao.class
                    .getName()).log(Level.SEVERE, null, ex);
        }
        this.conexao.closeConnection();
        return capituloLivro;

    }

    public ArrayList<Autor> buscarAutoresLivro(Capitulo capitulo) {
        ArrayList<Autor> autoresObra = new ArrayList<Autor>();
        try {
            ps = conexao.getConnection().prepareStatement("SELECT a.id, a.restante_nome, a.ultimo_nome, a.id_instituicao, i.nome, i.estado, i.municipio, a.lattes"
                    + " FROM autor AS a, instituicao AS i, obra_autor AS oa, obra AS o"
                    + " WHERE o.id = ? AND o.id = oa.id_obra AND a.id = oa.id_autor AND a.id_instituicao = i.id ORDER BY oa.posicao; ");

            ps.setInt(1, capitulo.getId());
            ResultSet rs = ps.executeQuery();
            conexao.closeConnection();
            Instituicao i = new Instituicao();
            Autor a = new Autor();
            while (rs.next()) {

                a.setId(rs.getInt("id"));
                a.setRestanteNome(rs.getString("restante_nome"));
                a.setUltimoNome(rs.getString("ultimo_nome"));
                a.setLattes(rs.getString("lattes"));
                i.setId(rs.getInt("id_instituicao"));
                i.setNome(rs.getString("nome"));
                i.setEstado(rs.getString("estado"));
                i.setMunicipio(rs.getString("municipio"));
                a.setInstituicaoAutor(i);

                autoresObra.add(a);

                a = new Autor();
                i = new Instituicao();
            }

        } catch (SQLException ex) {
            this.conexao.closeConnection();
            Logger
                    .getLogger(LivroDao.class
                    .getName()).log(Level.SEVERE, null, ex);
        }
        this.conexao.closeConnection();
        return autoresObra;

    }

    public Capitulo buscaIdCapitulo(Capitulo c) {
        Capitulo capitulo = new Capitulo();
        if (c != null) {
            System.out.println("Busca id Capitulo Livro");
            System.out.println(c.getTitulo());
            System.out.println(c.getAutoresToString());
            System.out.println("Id Livro Organizado: " + c.getLivroOrganizado().getId());

            capitulo = c;
            try {
                ps = conexao.getConnection().prepareStatement("SELECT id FROM obra WHERE (titulo = ? AND pagina_inicio = ? AND pagina_fim = ? AND tipo = ? AND obra_pai = ?) ; ");
                ps.setString(1, capitulo.getTitulo());
                ps.setInt(2, capitulo.getPaginaInicio());
                ps.setInt(3, capitulo.getPaginaFim());
                ps.setString(4, "Capítulo");
                ps.setInt(5, capitulo.getLivroOrganizado().getId());

                ResultSet rs = ps.executeQuery();
                conexao.closeConnection();
                while (rs.next()) {
                    capitulo.setId(rs.getInt("id"));
                    System.out.println("Id do Capitulo: " + capitulo.getId());
                }

            } catch (SQLException ex) {
                this.conexao.closeConnection();
                Logger
                        .getLogger(CapituloDao.class
                        .getName()).log(Level.SEVERE, null, ex);
            }

        }

        this.conexao.closeConnection();
        return capitulo;

    }

    public Capitulo buscarIdCapituloLivro(Capitulo c, int idObra) {

        Capitulo capituloLivro = new Capitulo();
        if (c != null) {
            System.out.println("Busca id Capitulo Livro");
            System.out.println(c.getTitulo());
            System.out.println(c.getAutoresToString());
            System.out.println("Id Obra: " + idObra);

            capituloLivro = c;
            try {
                ps = conexao.getConnection().prepareStatement("SELECT id FROM capitulo WHERE (id_obra = ? AND titulo = ? AND pagina_inicio = ? AND pagina_fim = ?) ; ");
                ps.setInt(1, idObra);
                ps.setString(2, c.getTitulo());
                ps.setInt(3, c.getPaginaInicio());
                ps.setInt(4, c.getPaginaFim());
                ResultSet rs = ps.executeQuery();
                conexao.closeConnection();
                while (rs.next()) {
                    capituloLivro.setId(rs.getInt("id"));
                    System.out.println("Id do Capitulo: " + capituloLivro.getId());
                }

            } catch (SQLException ex) {
                this.conexao.closeConnection();
                Logger.getLogger(CapituloDao.class.getName()).log(Level.SEVERE, null, ex);
            }

        }





        this.conexao.closeConnection();
        return capituloLivro;

    }

    public List<Capitulo> listarCapitulos() {
        List<Capitulo> capitulos = new ArrayList<Capitulo>();
        try {
            System.out.println("Fui Executado: Capitulo Dao  - listarCapitulos");
            ps = conexao.getConnection().prepareStatement("SELECT id, pagina_inicio, pagina_fim, obra_pai , titulo, tipo "
                    + "FROM obra WHERE tipo = 'Capítulo' ");
            ResultSet rs = ps.executeQuery();
            conexao.closeConnection();
            Capitulo capitulo = new Capitulo();
            LivroOrganizado lo = new LivroOrganizado();
            LivroOrganizadoDao loDao = new LivroOrganizadoDao();
            Iterator i;

            while (rs.next()) {
                capitulo.setId(rs.getInt("id"));
                capitulo.setTitulo(rs.getString("titulo"));
                capitulo.setPaginaInicio(rs.getInt("pagina_inicio"));
                capitulo.setPaginaFim(rs.getInt("pagina_fim"));
                capitulo.setTipo(rs.getString("tipo"));

                lo = loDao.consultaLivro(rs.getInt("obra_pai"));
                capitulo.setLivroOrganizado(lo);


                capitulo.setAutores((ArrayList) this.buscarAutoresLivro(capitulo));
                capitulos.add(capitulo);

                capitulo = new Capitulo();


            }


        } catch (SQLException ex) {
            this.conexao.closeConnection();
            Logger.getLogger(InstituicaoDao.class.getName()).log(Level.SEVERE, null, ex);
        } finally {
            this.conexao.closeConnection();
        }
        return capitulos;
    }

    public Capitulo buscarCapitulo(int id) {
        Capitulo capitulo = new Capitulo();
        try {
            System.out.println("Fui Executado: Capitulo Dao  - listarCapitulos");
            ps = conexao.getConnection().prepareStatement("SELECT id, pagina_inicio, pagina_fim, obra_pai , titulo, tipo "
                    + "FROM obra WHERE id = ? ");
            ps.setInt(1, id);
            ResultSet rs = ps.executeQuery();
            conexao.closeConnection();

            LivroOrganizado lo = new LivroOrganizado();
            LivroOrganizadoDao loDao = new LivroOrganizadoDao();
            Iterator i;

            if (rs.next()) {
                capitulo.setId(rs.getInt("id"));
                capitulo.setTitulo(rs.getString("titulo"));
                capitulo.setPaginaInicio(rs.getInt("pagina_inicio"));
                capitulo.setPaginaFim(rs.getInt("pagina_fim"));
                capitulo.setTipo(rs.getString("tipo"));

                lo = loDao.consultaDadosLivroOrganizado(rs.getInt("obra_pai"));
                capitulo.setLivroOrganizado(lo);


                capitulo.setAutores((ArrayList) this.buscarAutoresLivro(capitulo));
            }


        } catch (SQLException ex) {
            this.conexao.closeConnection();
            Logger.getLogger(InstituicaoDao.class.getName()).log(Level.SEVERE, null, ex);
        } finally {
            this.conexao.closeConnection();
        }
        return capitulo;
    }
}
